package net.sunofbeach.blog.controller.admin;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import net.sunofbeach.blog.pojo.FriendLink;
import net.sunofbeach.blog.pojo.User;
import net.sunofbeach.blog.response.Result;
import net.sunofbeach.blog.response.ResultEnum;
import net.sunofbeach.blog.service.FriendsService;
import net.sunofbeach.blog.service.UserService;
import net.sunofbeach.blog.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 友情链接控制器
 * </p>
 *
 * @author Bing
 * @since 2021-11-24
 */
@Api(tags = "友情链接管理")
@RestController
@RequestMapping("/admin/friends")
public class FriendsAdminApi {

    @Resource
    private UserService userService;

    @Resource
    private FriendsService friendsService;

    /**
     * 添加
     *
     * @return
     */
    @ApiOperation("添加友情链接")
    @PostMapping
    public Result addFriendLink(@RequestBody FriendLink friendLink) {
        // 检验当前操作用户的身份
        User currentUser = userService.checkSobUser();
        if (currentUser == null) {
            // 账号未登录
            return Result.build(null, ResultEnum.ACCOUNT_NOT_LOGIN);
        }
        // 判断角色，拥有 role_admin 角色可以操作
        if (!Constants.User.ROLE_ADMIN.equals(currentUser.getRole())) {
            // 权限不足
            return Result.build(null, ResultEnum.PERMISSION_DENIED);
        }

        // 判断数据
        if (StringUtils.isEmpty(friendLink.getName())) {
            return Result.fail().message("友情链接名称不能为空");
        }
        if (StringUtils.isEmpty(friendLink.getLogo())) {
            return Result.fail().message("友情链接logo不能为空");
        }
        if (StringUtils.isEmpty(friendLink.getUrl())) {
            return Result.fail().message("友情链接地址不能为空");
        }
        boolean result = friendsService.save(friendLink);
        return result ? Result.ok().message("添加友情链接成功") : Result.fail().message("添加友情链接失败");
    }


    @ApiOperation("根据ID获取友情链接详情")
    @PreAuthorize("@permission.admin()")
    @GetMapping("/{friendLinkId}")
    public Result getFriendLink(@PathVariable("friendLinkId") String friendLinkId) {
        if (StringUtils.isEmpty(friendLinkId)) {
            return Result.fail().message("友情链接ID不能为空");
        }
        FriendLink friendLink = friendsService.getById(friendLinkId);
        if (friendLink == null) {
            return Result.fail().message("该友情链接不存在");
        }
        return Result.ok(friendLink).message("获取友情链接成功");
    }


    /**
     * 列表
     *
     * @return
     */
    @ApiOperation("友情链接列表")
    @PreAuthorize("@permission.admin()")
    @GetMapping("/list")
    public Result listFriendLinks(FriendLink friendLink) {
        // 管理员，获取所有分类信息
        List<FriendLink> list = friendsService.list(new LambdaQueryWrapper<FriendLink>().orderByAsc(FriendLink::getSort).orderByDesc(FriendLink::getState).orderByDesc(FriendLink::getCreateTime));
        return Result.ok(list);
    }


    /**
     * 删除（修改状态）
     *
     * @param friendLinkId
     * @return
     */
    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
    @ApiOperation("根除ID删除友情链接")
    @DeleteMapping("/{friendLinkId}")
    public Result deleteFriendLink(@PathVariable("friendLinkId") String friendLinkId) {
        // 检验当前操作用户的身份
        User currentUser = userService.checkSobUser();
        if (currentUser == null) {
            // 账号未登录
            return Result.build(null, ResultEnum.ACCOUNT_NOT_LOGIN);
        }
        // 判断角色，拥有 role_admin 角色可以操作
        if (!Constants.User.ROLE_ADMIN.equals(currentUser.getRole())) {
            // 权限不足
            return Result.build(null, ResultEnum.PERMISSION_DENIED);
        }
        if (StringUtils.isEmpty(friendLinkId)) {
            return Result.fail().message("友情链接ID不能为空");
        }

        FriendLink friendLink = friendsService.getById(friendLinkId);
        if (friendLink == null) {
            return Result.fail().message("该友情链接不存在");
        }
        friendLink.setState(Constants.Status.DELETE);
        friendsService.updateById(friendLink);
        return Result.ok().message("删除友情链接成功");
    }


    /**
     * 更新
     * 更新的内容：
     * 1、url
     * 2、对方网站名称
     * 3、order
     * 4、logo
     *
     * @param friendLink
     * @return
     */
    @ApiOperation("更新友情链接")
    @PutMapping
    public Result updateFriendLink(@RequestBody FriendLink friendLink) {
        // 检验当前操作用户的身份
        User currentUser = userService.checkSobUser();
        if (currentUser == null) {
            // 账号未登录
            return Result.build(null, ResultEnum.ACCOUNT_NOT_LOGIN);
        }
        // 判断角色，拥有 role_admin 角色可以操作
        if (!Constants.User.ROLE_ADMIN.equals(currentUser.getRole())) {
            // 权限不足
            return Result.build(null, ResultEnum.PERMISSION_DENIED);
        }
        // 检查数据
        if (StringUtils.isEmpty(friendLink.getName())) {
            return Result.fail().message("友情链接名不能为空");
        }
        if (StringUtils.isEmpty(friendLink.getUrl())) {
            return Result.fail().message("友情链接地址不能为空");
        }
        if (StringUtils.isEmpty(friendLink.getLogo())) {
            return Result.fail().message("友情链接logo不能为空");
        }
        boolean result = friendsService.updateById(friendLink);
        if (result) {
            return Result.ok().message("友情链接更新成功");
        }
        return Result.fail().message("友情链接更新失败");
    }

}

